{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# GraphPipeline\n",
    "\n",
    "GraphPipelines (`tpot.GraphPipeline`) work similarly to the scikit-learn Pipeline class. Rather than provide a list of steps, in GraphPipeline you provide a directed acyclic graph (`networkx.DiGraph`) of steps using networkx. In GraphPipeline, parents get their inputs from their children (i.e the leafs get the raw inputs (X,y), and the roots are the final classifiers/regressors). \n",
    "\n",
    "The label of the nodes can be anything, but must unique per instance of an sklearn estimator. Each node has an attribute called \"instance\" for the instance of the scikit-learn estimator.\n",
    "\n",
    "GraphPipeline allows for classifiers and regressors in the middle of the pipeline. In this case, GraphPipeline will will try to use the outputs of predict_proba, decision_function, or predict in that order. If cross_val_predict_cv is set, the downstream models are trained with the output of `sklearn.model_selection.cross_val_predict` (final results are predicted using the models trained on the full data).\n",
    "\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "\n",
    "    graph: networkx.DiGraph\n",
    "        A directed graph where the nodes are sklearn estimators and the edges are the inputs to those estimators.\n",
    "    \n",
    "    cross_val_predict_cv: int, cross-validation generator or an iterable, optional\n",
    "        Determines the cross-validation splitting strategy used in inner classifiers or regressors\n",
    "\n",
    "    method: str, optional\n",
    "        The prediction method to use for the inner classifiers or regressors. If 'auto', it will try to use predict_proba, decision_function, or predict in that order.\n",
    "\n",
    "    memory: str or object with the joblib.Memory interface, optional\n",
    "        Used to cache the input and outputs of nodes to prevent refitting or computationally heavy transformations. By default, no caching is performed. If a string is given, it is the path to the caching directory.\n",
    "\n",
    "    use_label_encoder: bool, optional\n",
    "        If True, the label encoder is used to encode the labels to be 0 to N. If False, the label encoder is not used.\n",
    "        Mainly useful for classifiers (XGBoost) that require labels to be ints from 0 to N.\n",
    "\n",
    "        Can also be a sklearn.preprocessing.LabelEncoder object. If so, that label encoder is used."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnYAAAHWCAYAAAD6oMSKAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAXhtJREFUeJzt3Qd4lFXWwPGTShpJCIEQShBjKALSpEgARRCRJgiIukpXVD4b9sddC66fu7Z1LdgR2FU/y+rKiq6uCihNICC9gySEJBBCCCmkTPI952pm5yWglEneKf/f8+SB3CQzJ5mZ956555aAqqqqKgEAAIDXC7Q7AAAAALgHiR0AAICPILEDAADwESR2AAAAPoLEDgAAwEeQ2AEAAPgIEjsAAAAfQWIHAADgI0jsAAAAfASJHQAAgI8gsQMAAPARJHYAAAA+gsQOAADAR5DYAQAA+AgSOwAAAB9BYgcAAOAjSOwAAAB8BIkdAACAjyCxAwAA8BEkdgAAAD6CxA4AAMBHkNgBAAD4CBI7AAAAH0FiBwAA4CNI7AAAAHwEiR0AAICPILEDAADwESR2AAAAPiLY7gAAwJ0cDofk5eVJTk6O+TiYnS2lJSVS6XBIYFCQ1AsPl0ZNmkhCQoL5iIuLk6CgILvDBgC3CKiqqqpyz00BgH0OHz4s69atkw1r1sixoiKpqqiQqJISicnLk5CKCgmsqpLKgAApDw6WI3FxUhgeLgHBwRIWGSkdu3aVTp06SYMGDez+NQDgrJDYAfBq+/fvl2VLlsieHTskpLhYktIzJDEvT2KKiiTE4Tjpz5UHBcmRyEjJiouT9KQWUh4RIa1SUiS1b19JTEys098BANyFxA6AV6qoqJClS5fKqqVLJSo3V87bmy7Nc3MlqLLytG/LERgo++LjZWfLJCmMj5fuqamSmpoqwcHMVgHgXUjsAHid7OxsWTB/vhzelyltd+yQlMxMU2o9W1qq3dGsmWxNSZG45s1kyIgR0qRJE7fEDAB1gcQOgFfZu3evfPL++xKxP0u6bdki0cXFbr+PgogISWvXToqbNpVR466Wli1buv0+AKA2kNgB8Kqk7h/vvScN96ZLj82bJfgMyq6nqiIwUH5of77kJSXJ6GuvJbkD4BXYxw6A15RfdaQubm+69Nq0qVaTOqW3f9HGTRKXni6fvP+BuX8A8HQkdgC8YqGEzqnT8mvPzZvdMp/uVOj99Ny0WcKz9svn8+ebOADAk5HYAfB4uvpVF0ronLraHqk7nt5ft81bJC8zU5YtW1an9w0Ap4vEDoDH71OnW5ro6tfaWChxKmKKi6XN9h2ycskSycrKsiUGADgVJHYAPJpuPqz71OmWJnZqnZlp4li6ZImtcQDAryGxA+DRx4TpiRK6+XBdzas7Gb3/5L3psmf7dhMXAHgiEjsAHkvPftVjwvRECU/QIjdXgouLZf369XaHAgAnRGIHwCM5HA7ZsGaNOfv1TI4Jqw0aR8uMDFmflmbiAwBPQ2IH4IzEx8ef9W1MnTpVdu3adcKv5eXlyX/+8x+Jdxmtu2HDr4+UXb9+vVyetlqGr1kjV/24VjYXFoq7JR7Kk2NFRSa+U7V69Wq599573R4LAByPkycAnHFil1uLJdKNGzdKvz595KsOHSUmIOCUfkYTu4eTk6V1ZKR8kJ0tn+celDkdOp5VHI6qKglyuf/yoCD57OJ+MmTsWOnQocNZ3TYAuBsjdgDcZs2aNdKjRw/p2LGjjB8/Xo4dO2baP/30U2ndurV0795dpkyZIvfcc49pv+SSS0wCp2XN66+/Xs4//3zzs2+//ba8/vrrUnD0qFy/do3cvHmT+f4eK5Y77+uVjHQZtiZNhq9Jk7dPsGK2W3S0ZJeWOpOzJ3fvNqN4Opo3/8AB017scMitmzfLFWmr5YHt2+WSVSulyOGQH/LzZfyG9TJ100a5Zv068333b99mfv7q1aslY8sWycnJkYULF5p4O3XqJBdeeKG5zQ0bNkjXrl2lc+fO5uPAgQOyaNEiGTNmjPm6JsPDhw+XCy64wPz+P/30k2mfOHGi3HHHHdKrVy9JSUmRxYsX1/KjBcAXkdgBcJsJEybIiy++aJKbyMhImTVrlpSUlMjtt98u3377rSxfvvyEpdcff/xR9uzZI5s3bzY/e9VVV0nvnj2lQUSE/F+nzvLq+e0t378oL0+W5+fLx527yL+6dpNRjRvXuE39ngFxDc3/P8zJlsahoeb7P+zUSd7Yt08Ol5fLO1n7pVlYPfmi24UyvHEj2f9LIqg2FhbKE+elyIedOssrGRnSPy7O/PxbHTrIP776Sg5kZclzzz1nPnSRxzfffGN+ThPSW265xfxO+vvGxsZa4nr00Uelb9++ZgGGfp/+bappeXfFihXy2muvycyZM93wiADwN8F2BwDAN+Tn50tpaan07NnTfH7DDTfI008/LZdeeqm0bdtWmjdvbtpHjx4te/futfzsueeeazYinj59ulx55ZUyaNAgKS0p0bkiJ7yvZfn5MjqhiYQG/vzeNDYkxPm127ZukbLKSil0OGR+l66mbenhw7K9uFg+PfjzSF2ho0Iyjh2TNQVH5aZf4kqNbSCxwf+9JHaNjpaEevV+/vn8w7Io75DMysgwn5dVVcnBAwckNTVVHnjgAdmyZYuMHTtWYmJi5KKLLjJJ2aFDh+Tqq682v5urJUuWyOeff27+r1/XUbpqI0eONP9269bNOZIHAKeDxA5ArTqVabwNGjQwI3Wa8PzlL3+Rr776StqnpJzR/b3Ytp2kRETI/+7ZLX/cvUtebne+6Jrax887T3rEWEfPRE4eW/gvSaOqrKoyo4bNwsLM5+vObSVHIyPl9hkz5IorrpDPPvvMlFD1yLHrrrvOlKP/9a9/yWWXXSYffvjhr8Yb4DJ/r94viWRQUBCrbgGcEUqxANxCS46amKxatcp8/s4770i/fv3MaN3WrVslMzPTJCsff/xxjZ/VeWeVlZVmBEtLlVrGDAwKkrCQEDPn7Xi9Y2PlHznZZmRO5ZeX10iWZrQ8R34sKJDdxcXSJ7aBvJOVZebaqe1FReb/XaKj5YtfFoBoaTe/ouKEv1tqgwYyb/9+5+e7Dx+WoOBgU1bW+XUPPfSQmR+o5eTdu3dLcnKy3HXXXWbkUcvLrvr06SPvvvuu+f9HH31kkkAAcBdG7ACcET19obq8qrTsOmfOHDNvTBdN6MIB/X9YWJg8//zz0r9/f1Oq1EQvOjraclua9OniAU3ugoODzfdnpqfLJW3byg3r1kmr8HDLPLtL4uJkU2GhjPxxrQQHBMjoxgkyoVkzy22GBwXJ5GbNZXZmpjx23nmy79gxGbl2jRm9axQaKm+27yC/S2wq92zbKkPWpEmnqPqSEBoqYS4jddWmt0gyo3+6UKOiqkoSmjaV28aNM6OLuoBCR9h0YYiWYZ966in5+9//LiEhIdKyZUsZNWqUM9lVmrjq7zpv3jyJi4szfzMAcBe2OwFQ6woLCyUqKsqM2OnCiBtvvFGGDRv2qz+jixG2ffmlXLZ8Ra3FpUmalll1rt66o0flsV07zQKJ3/Kfi3pJm8svlwEDBtRabABwJhixA1DrXnnlFVOa1cUVAwcOlKFDh/7mzyQkJEhaeLjZNy6kluab6TYmEzZsMAleSGCAPJp83m/+jMZTGB5u4gMAT8OIHQCPdPDgQZnz6qvSZ8UPEl9QIJ4iNzpalvTqKRNvvlkaNWpkdzgAYMHiCQAeSeefhUVGSlZcnHiSrIY/x6XxAYCnIbED4JF0QULHrl0lPamFOE6woMEOGsfeFi3kgm7dTHwA4Gk842oJACegW4mUR0TIvvj4Wrn9gqMFsj8rSw4cPCDlJ9nqxFVGfLxURESY48AAwBOR2AHwWLpxcauUFNnZMkkqXTbydQdN5HS1rm5SXFFRYY7z0hWyJ6P3v6tlkrRq3drEBQCeiMQOgEdL7dtXCuPjZcdx+9S5m8NRIQW/skhje7NmJo7UPn1qNQ4AOBskdgA8WmJionRPTZWtKSlSEBFh+ZqOr5WWlZmNjU9XSHCwhIb+fIRXteLiIjlWWlrje49ERMi21inSo08fEw8AeCoSOwAeLzU1VRo0byZp7dpJxS8LKYpLSiQ7K0sOHcqV7JwcKTl27IyOQQsIsF4Gj+TnW0qyen9p57eTuGbNpHfv3m74bQCg9pDYAfB4eszY0BEjpLhpU1neto0cOHRI8vMPS5UZs1NVcvQM9roLDgqqcbyZo9IhR44ccc6r+6H9+VKS2FSGjBhh4gAAT0ZiB8ArlJWVyYZtW2VbRIT8eGE3cRy/3cgZLq6IjIiQevXCLG0lJcVSVFYmyzu0l7ykJBk17mpp0qTJ2YQPAHWCkycAeLxvv/1Whg8fLsXFxZKUlCRjR46UpsXF0i4tTSJ+GamLjIiUmJiYM7p9PcP2wMGDUlX181y9ouho2XZhd6k6t5WMvvZaadmypVt/HwCoLSR2ADxev3795Pvvv3d+3rhxYxkxdKg0a9BAUrZulabbt0tcdIxEHLe44nTonL28I/myv3Vr2dG2rWTm5UlJebn87W9/kwA3b7UCALWFCSMAPN7x8+AOHDggb8+bZxYzlHbvLtnNm8v52TnSKj9fgs5ghayeKHGgZUvZlNBdcsLDZemqVbJs2TIzkjds2DC55ppr3PjbAEDtYcQOgMfbuXOn9O/fX/bt21fjazr3LbV3b+neubOEHjsmLTMyJPFQnsQUFUmIw3HS2ywPCpIjehZtwzhzTJieKJHYooU8/sQTsn37duf36ZmwGzduZJsTAF6BxA6Ax9PL1ODBg+Wrr7464dd1tWp2drZJwNanpcmxoiKpqqiQqJISic47LKEVFRJYVSmVAYFSFhwsBXENpDA8XAKCgyUsMtKc/arHhOmJEh988IGMGzfOcvs6ajd//nxKsgA8HokdAI83e/ZsmTJlykm/fuGFF8qqVavM/7V8qseD5eTkmI+D2dlSduyYOCoqJEg3JQ4Lk0ZNmkhCQoL50BG5oONW2Gpipwmeq7ffflsmTpxYS78hALgHiR0Aj7Z3717p2LGjHD161NnWqFEjGThwoHz00Udmk2H9VxdYuEtubq506NDBJIau8/x0RLBFixZuux8AcDcSOwAeS48KGzRokHzzzTeWdi2L6vYnJSUlEhYWVislUr2PK6+80tKmyaSWgynJAvBUbFAMwGO9+uqrNZI6LYdqUqfCdZ5cLSVZI0aMkAkTJljavv76axMTAHgqRuwAeOxK2E6dOplNias1b97clEPPdCPi05Wfn29KspmZmc62yMhIWbdunSQnJ9dJDABwOhixA+BxdAHEpEmTLEmdeuutt+osqVM6f08XbrgqKioysWmZGAA8DYkdAI/z/PPPy5IlSyxtN998s5lvV9f0PqdNm2Zp01Mw/vrXv9Z5LADwWyjFAvAoW7ZskS5dukhpaamzrVWrVrJ+/XqJioqyJSZdkatl4T179jjb6tWrJz/++KO0bdvWlpgA4EQYsQPgMSoqKsyCBdekThdHzJkzx7akTtWvX9/sY+dKY9RYNWYA8BQkdgA8xp///GfnRsPV7rzzTrfuUXemLr74YhOLq5UrV8pTTz1lW0wAcDxKsQA8gq407d69u5SXlzvb2rRpI2vXrjXbmngC3Tevc+fOlrNkQ0JCZPXq1eZIMgCwGyN2AGxXVlYm48ePtyR1gYGBMnfuXI9J6pTGojFpbNU0Zo1dfwcAsBuJHQDbzZw50yyOcHX//fdLz549xdP06tVL7rvvvhqjjX/84x9tiwkAqlGKBWArnafWu3dvs3ddNT0bVufa6cpTT6QLJy688EKzWXK1oKAgWb58uSknA4BdSOwA2DpnrWvXrrJ161ZnW3BwsEnqdC6bJ9O5fz169LCsim3Xrp2sWbPGnF8LAHagFAvANn/4wx8sSZ16+OGHPT6pU7rXnsZ//B58x7cBQF1ixA6ALfT0Bt1CxPUS1K1bN1PO1JWm3kAXTlx00UWSlpZm2XdPf7fU1FRbYwPgn0jsANS5wsJCc5LD7t27nW06n04TpPbt24s32bRpkyknu66KTU5ONgsqIiMjbY0NgP+hFAugzumKV9ekTj3++ONel9QpjVljd7Vr1y554IEHbIsJgP9ixA5Anfr666/lsssus7TpqtjvvvvOrCz1Rrqit2/fvqaMfPzvOmDAANviAuB/SOwA1JkjR46YrUwyMjIsm/5q2TIlJUW82Y4dO0x5WVf6VktKSpINGzZIdHS0rbEB8B+UYgHUmRkzZliSOqVnrXp7Uqf0d9Czbl2lp6eb3xkA6gojdgDqxGeffSbDhw+3tPXv39+UK12P6PJmlZWVMnDgQFm4cKGlfcGCBTJkyBDb4gLgP0jsANS6Q4cOSYcOHSQ7O9vZVr9+fXOM2DnnnCO+5KeffjLlZl35Wy0xMdGcUhEXF2drbAB8n2+8TQbg0W677TZLUqeee+45n0vqlP5O+ru5ysrKkttvv922mAD4D0bsANSqjz76SMaOHWtpu+KKK0x5Ujfz9UV6WdXS67///W9L+z/+8Q+56qqrbIsLgO8jsQNQaw4cOGD2ecvNzXW2xcbGmk19mzZtKr4sMzPTlJ/z8/OdbY0aNTIl2caNG9saGwDfRSkWQK3Q94zTpk2zJHXqpZde8vmkTjVr1kxefPFFS9vBgwfllltusRyjBgDuRGIHoFa888478s9//tPSNmrUKLnuuuvEX/zud7+TkSNHWto+/vhjee+992yLCYBvoxQLoE7KkPHx8aYE629lyJycHPO38MdyNIC6x4gdALfS94pTp061JHXq1Vdf9bukTiUkJMgrr7xiadO/zY033khJFoDbkdgBcKu33nqrxmpQLb+OHj1a/NWYMWPk2muvtbR9/vnnMnv2bNtiAuCbKMUCcBs25z25vLw8s0L4+E2a9SzZli1b2hobAN/BiB0Atx2nNWnSJEtSp9544w2/T+qU/g30b+Hq6NGjMnnyZPO3AwB3ILED4BYvv/yyLFq0yNI2ZcoUGTp0qG0xeZphw4aZ5NfVt99+W2MOHgCcKUqxAM7a9u3bpXPnzlJSUuJsS0pKMmXG6OhoW2PzNEeOHDHl6oyMDGdbRESErFu3Ts477zxbYwPg/RixA3BWHA6HTJw40ZLUKV0YQFJXU0xMTI1FE8XFxeZvqH9LADgbJHYAzsqzzz4ry5cvt7RNnz5dBgwYYFtMnm7gwIFy6623WtqWLl0qf/nLX2yLCYBvoBQL4IzpJrtdu3aVsrIyZ1tycrIpK0ZGRtoam6fTRSZavt61a5ezrV69erJmzRo5//zzbY0NgPdixA7AGSkvL5fx48dbkrqAgACZO3cuSd0piIqKkjlz5pi/WbXS0lKZMGGCVFRU2BobAO9FYgfgjDz55JNmdMnV3XffLampqbbF5G369OkjM2bMsLStXr1a/vSnP9kWEwDvRikWwGnThK5nz56WkaV27dqZ9rCwMFtj8za66ETL2Vu3bnW2BQcHy6pVq0ypFgBOByN2AE7LicqFQUFBpgRLUnf6wsPDZd68eeZvWE3/tvo31r81AJwOEjsAp+XRRx81R4S5evDBB6V79+62xeTt9G/3wAMPWNrWr18vM2fOtC0mAN6JUiyAU7ZixQozh871CKxOnTrJypUrJTQ01NbYvJ0uQtEETxO6aoGBgbJs2TJT9gaAU0FiB+CU6Ca6Xbp0MadMVAsJCTGT/S+44AJbY/MVuk2MJne64rhamzZtZO3ataZkCwC/hVIsgFPy0EMPWZK66rIsSZ376OjnI488Ymnbtm2b/P73v7ctJgDehRE7AL9p8eLFcskll1jaevToYU5L0BWccB9dONG7d2+zKraa7nWnj0Hfvn1tjQ2A5yOxA/Crjh49akaS9uzZ42zT1a9aHmzbtq2tsfmqLVu2mLK366rYVq1amfl3urExAJwMpVgAv+ree++1JHXqiSeeIKmrRbonoP6NXeljcN9999kWEwDvwIgdgJP68ssvZfDgwZY2LQcuXLjQsu8a3M/hcJjy95IlSyztX331lVx22WW2xQXAs5HYATih/Px86dChg2RmZjrbIiIiTDkwOTnZ1tj8xa5du8ziFF2RXK158+ZmH8GYmBhbYwPgmSjFAjihO++805LUqWeeeYakrg7p3/rpp5+2tO3bt0/uuusu22IC4NkYsQNQw/z58+XKK6+0tA0cONCUAXWFJuqObgY9aNAg+eabb2o8RsOHD7ctLgCeicQOgEVubq4pwebk5DjboqOjZcOGDZKUlGRrbP4qPT3dPCa6QrlaQkKCbNq0SRo2bGhrbAA8C6VYABbTp0+3JHXq+eefJ6mzkf7t9TFwpY/R//zP/9gWEwDPxIgdAKf3339frrnmGkvbsGHDTNmPEqy99FKtpdcFCxZY2j/44AMZO3asbXEB8CwkdgCM7Oxsad++veTl5TnbGjRoYMp9iYmJtsaGn2VlZZnH6PDhw842LcXqY6SlWQCgFAvAjAZNmzbNktSpWbNmkdR5EH0sXn75ZUvboUOHzGPHe3QAisQOgMybN8+UW12NGTNGxo0bZ1tMODEtlY8ePdrS9umnn8rf//5322IC4DkoxQJ+LiMjQzp27ChHjhxxtjVu3NhsgtuoUSNbY8OJHTx40JRk9d9qumGxPma6gTEA/8WIHeDH9H3d1KlTLUmdeu2110jqPJg+NvoYudLHUB9L3qsD/o3EDvBjr7/+utl02NUNN9wgI0eOtC0mnJpRo0bJ9ddfX+Ns3zfeeMO2mADYj1Is4Kd2795tziEtKipytjVt2tSU83Q1LDyfro7VjYv379/vbIuKijLn+bZq1crW2ADYgxE7wE+PqZo0aZIlqVNvvfUWSZ0X0cfqzTfftLQVFhaax1YfYwD+h8QO8EMvvPCCfPfdd5a2G2+8UQYPHmxbTDgzV1xxhZlb52rx4sXy0ksv2RYTAPtQigX8zLZt26Rz585y7NgxZ9s555xjynf169e3NTacmYKCAlNW37t3r7MtPDxcfvzxR2ndurWtsQGoW4zYAX6koqJCJkyYYEnq1OzZs0nqvFh0dLS8/fbblraSkhLzWDscDtviAlD3SOwAP/LMM8/IDz/8YGm7/fbbpX///rbFBPfQx/C2226ztK1YscI85gD8B6VYwE9s2LBBunXrJuXl5c62lJQUU66LiIiwNTa4hy6G0TL7zp07nW2hoaGSlpZmVs8C8H2M2AF+oKyszJTlXJO6wMBAmTNnDkmdD4mMjJS5c+eax9b1sR8/frzlsQfgu0jsAD/wxBNPyNq1ay1t99xzj/Tu3du2mFA79DG9++67LW362P/v//6vbTEBqDuUYgEfp2W4nj17WibR6zmjq1evlrCwMFtjQ+3QxTFadt+8ebOzLTg42Myv7Nq1q62xAahdjNgBPt7BaxnONakLCgoy5TqSOt+lj+28efPMY+26IlqfC6WlpbbGBqB2kdgBPuyRRx6xjNqo3//+92Y0B75NH+OHHnrI0rZp0ybznADguyjFAj5q2bJl0qdPH3F9iXfp0sWU40JCQmyNDXVDF0706tXLMr9SF1YsWbJELrroIltjA1A7SOwAP9r2QufVdezY0dbYULfY5gbwL5RiAR/04IMPWpI69dhjj5HU+SF9zGfOnGlp27Fjh3mOAPA9jNgBPubbb7+VAQMGWNq0HPf999+blZHwP7pwQsvyx586os8VTh0BfAuJHeBDOAweJ7Nt2zZTnnc9J/icc86R9evXc04w4EMoxQI+RDemdU3q1JNPPklSB2nTpo15Lrj66aefzEbVAHwHI3aAj/jiiy9kyJAhlraLL77YlNtcj5iC/6qsrJRLL71UFi9eXOO5M3jwYNviAuA+JHaADzh8+LA55H3//v3OtqioKFNma9Wqla2xwbPs3r3blOt15XS1Zs2amdWzDRo0sDU2AGePt/GAD7j99tstSZ169tlnSepQw7nnnmueG64yMzPljjvusC0mAO7DiB3g5T755BO56qqrLG2XX365Ka8FBATYFhc8l172tfT61Vdf1XgujRw50ra4AJw9EjvAix08eFDat29v/q0WExMjGzdulObNm9saGzxbRkaG2ePuyJEjzrbGjRubY8fi4+NtjQ3AmaMUC3gpfU92yy23WJI69cILL5DU4Te1aNFC/vrXv1raDhw4YJ5TvN8HvBcjdoCXeu+99+S6666ztF155ZWmnEYJFqdCL/9aep0/f36N59Y111xjW1wAzhyJHeCFdKGEroLV1bDVGjZsaMpoCQkJtsYG75KdnW3K+Xl5ec62uLg4U85PTEy0NTYAp49SLOBl9L3YTTfdZEnq1CuvvEJSh9PWpEkT89xxpUmePsd43w94HxI7wMu8/fbbsmDBAkvbuHHjZOzYsbbFBO929dVXmw9Xn332mcydO9e2mACcGUqxgBfR48J0JePRo0edbTpKpyVYLcUCZyo3N9eU93Nycpxt0dHRpiSrCy0AeAdG7AAvOg5qypQplqROvfHGGyR1OGu6xcnrr79uaSsoKJDJkydTkgW8CIkd4CVeffVV+eabbyxtEydOlOHDh9sWE3zLiBEjZMKECZa2r7/+2jz3AHgHSrGAF9i5c6d06tRJiouLnW26V52WyXRDYsBd8vPzTUlWjxmrFhkZKevWrZPk5GRbYwPw2xixAzycw+GQSZMmWZI69dZbb5HUwe1iY2Nl9uzZlraioiLzHNTpAAA8G4kd4OGef/55WbJkiaXt5ptvlkGDBtkWE3ybPremTZtmafv+++9rnFQBwPNQigU82JYtW6RLly5SWlrqbGvVqpWsX79e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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "score\n",
      "0.8974358974358974\n"
     ]
    }
   ],
   "source": [
    "from sklearn.svm import SVC\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.datasets import make_classification\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.pipeline import Pipeline\n",
    "import networkx as nx\n",
    "from tpot import GraphPipeline\n",
    "import sklearn.metrics\n",
    "\n",
    "X, y = make_classification(random_state=0)\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y,\n",
    "                                                    random_state=0)\n",
    "\n",
    "\n",
    "g = nx.DiGraph()\n",
    "\n",
    "g.add_node(\"scaler\", instance=StandardScaler())\n",
    "g.add_node(\"svc\", instance=SVC())\n",
    "g.add_node(\"LogisticRegression\", instance=LogisticRegression())\n",
    "g.add_node(\"LogisticRegression2\", instance=LogisticRegression())\n",
    "\n",
    "g.add_edge(\"svc\",\"scaler\")\n",
    "g.add_edge(\"LogisticRegression\", \"scaler\")\n",
    "g.add_edge(\"LogisticRegression2\", \"LogisticRegression\")\n",
    "g.add_edge(\"LogisticRegression2\", \"svc\")\n",
    "\n",
    "\n",
    "est = GraphPipeline(g)\n",
    "est.plot()\n",
    "est.fit(X_train, y_train)\n",
    "print(\"score\")\n",
    "print(sklearn.metrics.roc_auc_score(y_test, est.predict_proba(X_test)[:,1]))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Cross val predict\n",
    "\n",
    "Using cross_val_predict_cv can improve performance in some cases. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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L5RiAR/04IMPWpI69dhjj5HU+SF9zGfOnGlp27Fjh3mOAPA9jNgBPubbb7+VAQMGWNq0HPf999+blZHwP7pwQsvyx586os8VTh0BfAuJHeBDOAweJ7Nt2zZTnnc9J/icc86R9evXc04w4EMoxQI+RDemdU3q1JNPPklSB2nTpo15Lrj66aefzEbVAHwHI3aAj/jiiy9kyJAhlraLL77YlNtcj5iC/6qsrJRLL71UFi9eXOO5M3jwYNviAuA+JHaADzh8+LA55H3//v3OtqioKFNma9Wqla2xwbPs3r3blOt15XS1Zs2amdWzDRo0sDU2AGePt/GAD7j99tstSZ169tlnSepQw7nnnmueG64yMzPljjvusC0mAO7DiB3g5T755BO56qqrLG2XX365Ka8FBATYFhc8l172tfT61Vdf1XgujRw50ra4AJw9EjvAix08eFDat29v/q0WExMjGzdulObNm9saGzxbRkaG2ePuyJEjzrbGjRubY8fi4+NtjQ3AmaMUC3gpfU92yy23WJI69cILL5DU4Te1aNFC/vrXv1raDhw4YJ5TvN8HvBcjdoCXeu+99+S6666ztF155ZWmnEYJFqdCL/9aep0/f36N59Y111xjW1wAzhyJHeCFdKGEroLV1bDVGjZsaMpoCQkJtsYG75KdnW3K+Xl5ec62uLg4U85PTEy0NTYAp49SLOBl9L3YTTfdZEnq1CuvvEJSh9PWpEkT89xxpUmePsd43w94HxI7wMu8/fbbsmDBAkvbuHHjZOzYsbbFBO929dVXmw9Xn332mcydO9e2mACcGUqxgBfR48J0JePRo0edbTpKpyVYLcUCZyo3N9eU93Nycpxt0dHRpiSrCy0AeAdG7AAvOg5qypQplqROvfHGGyR1OGu6xcnrr79uaSsoKJDJkydTkgW8CIkd4CVeffVV+eabbyxtEydOlOHDh9sWE3zLiBEjZMKECZa2r7/+2jz3AHgHSrGAF9i5c6d06tRJiouLnW26V52WyXRDYsBd8vPzTUlWjxmrFhkZKevWrZPk5GRbYwPw2xixAzycw+GQSZMmWZI69dZbb5HUwe1iY2Nl9uzZlraioiLzHNTpAAA8G4kd4OGef/55WbJkiaXt5ptvlkGDBtkWE3ybPremTZtmafv+++9rnFQBwPNQigU82JYtW6RLly5SWlrqbGvVqpWsX79e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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "score\n",
      "0.9166666666666666\n"
     ]
    }
   ],
   "source": [
    "est = GraphPipeline(g, cross_val_predict_cv=10)\n",
    "est.plot()\n",
    "est.fit(X_train, y_train)\n",
    "print(\"score\")\n",
    "print(sklearn.metrics.roc_auc_score(y_test, est.predict_proba(X_test)[:,1]))"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "You can access individual steps of a GraphPipeline using the label of each node."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: black;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, white)));\n",
       "  --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, black)));\n",
       "  --sklearn-color-icon: #696969;\n",
       "\n",
       "  @media (prefers-color-scheme: dark) {\n",
       "    /* Redefinition of color scheme for dark theme */\n",
       "    --sklearn-color-text-on-default-background: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-background: var(--sg-background-color, var(--theme-background, var(--jp-layout-color0, #111)));\n",
       "    --sklearn-color-border-box: var(--sg-text-color, var(--theme-code-foreground, var(--jp-content-font-color1, white)));\n",
       "    --sklearn-color-icon: #878787;\n",
       "  }\n",
       "}\n",
       "\n",
       "#sk-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       "#sk-container-id-2 label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content {\n",
       "  max-height: 0;\n",
       "  max-width: 0;\n",
       "  overflow: hidden;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  max-height: 200px;\n",
       "  max-width: 100%;\n",
       "  overflow: auto;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       "#sk-container-id-2 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       "#sk-container-id-2 div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       "#sk-container-id-2 div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       "#sk-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  display: inline-block;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 1ex;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "#sk-container-id-2 a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "</style><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>SVC()</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow fitted\">&nbsp;&nbsp;SVC<a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.5/modules/generated/sklearn.svm.SVC.html\">?<span>Documentation for SVC</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></label><div class=\"sk-toggleable__content fitted\"><pre>SVC()</pre></div> </div></div></div></div>"
      ],
      "text/plain": [
       "SVC()"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svc = est.graph.nodes[\"svc\"][\"instance\"]\n",
    "svc"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "tpotenv",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.16"
  },
  "orig_nbformat": 4
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
